home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
9303
/
VIVID.CD
< prev
next >
Wrap
Text File
|
1995-04-15
|
32KB
|
743 lines
@VKövessük a sugarakat!@N
@VVivid@N
A PC-sek körében kevésbé elterjedt, viszont az Amigák
világában igen felkapott a ray-tracing. Ennek talán az az
oka, hogy PC-n csak kevés és viszonylag lassú (legalábbis a
PC-sek felfogásához képest lassú) ray-tracing program van.
Az egyik legjobb ezek közül a Vivid programcsomag.
A ray-tracinget (sugárkövetés) a hetvenes években dolgozták
ki. Akkoriban a gépek még nem támogatták a képek grafikus
megjelenítését. A nyolcvanas évek közepén a ray-tracing
több hullámban, az olcsó és jó grafikus képességekkel
rendelkezô számítógépek megjelenésével egyre kedveltebb
lett. Talán ezért is van, hogy ha elhangzik a
""ray-tracing" szó, mindenki rögtön egy Amigára gondol.
Lehet, hogy igaza van, de a PC-k gyors fejlôdésükkel
betörtek a grafikai piacra is. Ma egy átlagos Super VGA
kártya általában többet nyújt, mint egy szokványos Amiga,
és az esetek többségében már egy nagyteljesítményû PC is
hozzáférhetô a szükséges számolások elvégzéséhez. Ilyenkor
már csak a megfelelô program hiányzik.
Én három (PC-s) ray-tracert ismerek közelebbrôl: a DBW
Rendert, a QRT-t és a Vividet. A DBW Render általában
nehézkesen használható, mivel egy igen barátságtalan
leírónyelven keresztül programozható (egy betû és utána egy
halom szám), ráadásul a generált képet alaphelyzetben
(különbözô saját konverterek nélkül) csak rossz hatásfokkal
lehet valamilyen megnézhetô formára hozni. A program Amiga
emulátor alá lett beültetve, és ez ront a teljesítményén.
A QRT-nél szintén a kép megnézésével volt gondunk. PC-s
változata ugyanis csak 64 színt kezel a leírás szerint, és
a kijövô formátumot ugyancsak nehézkes hasznosítani --
hiszen pontosan ugyanaz a formátuma, mint a DBW Renderé.
Elônye a szabadon definiálható alakzatokban rejlik. A
Vivid talán nem tud annyit, mint társai, de kényelmes és
könnyen használható -- illetve a hiányosságait (nem voltak
szabadon definiálható formák) egy saját készítésû
objektumeditorral (alakzatszerkesztôvel) könnyen ki
lehetett küszöbölni.
Ha végigolvastuk a program dokumentációját, fogalmat kapunk
leírónyelve -- amely leginkább a C-re hasonlít --
képességeirôl, és már azonnal, a leírásba alig-alig
belepillantva szép képeket hozhatunk össze. A kép
elkészítésének menete lehetôség szerint az egyszerûbbtôl
haladjon a fokozatosan bonyolultabbig. Tehát ne egy
papíron teljesen kidolgozott beállítást vigyünk be --
hacsak nem vagyunk nagyon gyakorlottak --, mert könnyen
csalódások érhetnek.
Talán lássunk egy rövid példát egy egyszerû, de látványos
rajz elkészítésének menetére! Az elkészítendô rajz legyen
mondjuk egy sakktábla figurákkal (teljes forrásszövege a
65. oldalon olvasható). Ha még nem foglalkoztunk
ray-tracerrel, akkor az egyik példafile fejlécét vegyük elô
-- bár elsô látásra kicsit bonyolult, de a késôbbiekben ezt
is ismertetjük. Ebben a fejlécben történik a környezet
paramétereinek beállítása. Itt olyan dolgokat adhatunk
meg, hogy mekkora legyen a kép felbontása, mi legyen az
alapvetô normálvektor, alkalmazzon-e antialiasinget (ez a
sugarak széttartásából származó felbontási hibákat
küszöböli ki), milyen legyen a háttér színe, a
háttérvilágítás színe. A kamera paramétereit is itt adjuk
meg, tehát a kamera pozícióját és azt, hogy merre néz.
Megadhatjuk a kamera fókuszpontját és lencseátmérôjét is,
de ha ezt elhagyjuk, a program egy fizikailag a képet nem
módosító lencsével számol -- tehát a kép minden pontja
egyformán éles lesz. Megadhatunk még ködösítést, amivel a
távolság érzetét lehet jobban alátámasztani és egy
véletlenítést, ami a képpontokat ""borzolja össze" ezáltal
valósabbá teszi azokat a képeket, amelyek bonyolult
textúrákat tartalmaznak. Ezek a beállítások a @Kstudio@N
@K=|@N [forrássor után következnek.
Ezek után helyezzünk el egy alaplapot -- hacsak nem
akarjuk, hogy a semmiben lógjanak a tárgyaink, bár az is
érdekes látvány. Érdemes az alaplapot körnek választani,
mert azt gyorsabban számolja ki a Vivid, mint egy
négyszöget. Helyezzük el a fô tárgyat. Ez általában a
legnagyobb illetve a kép jellegét legjobban meghatározó
tárgy, ezúttal a sakktábla. Számoltassuk ki a géppel,
mondjuk 40x40-es méretben, és nézzük meg, hogy körülbelül
jó-e. Használjunk nulla átmérôjû objektívet,
fókusztávolság nélkül, mert ez hozzávetôleg megtízszerezi a
sebességet.
A sakktábla tehát egy öt téglalapból álló test (a hatodik,
az alapja úgysem látszik, tehát érdemes elhagyni -- ilyen
apró trükkökkel sok számítási idôt takaríthatunk meg),
márványos színezetû. A készülô sakktábla tetejét (tehát
nem egy síkban a fedôlappal, mert akkor csak a fedôlapot
számolja ki a program, hanem elhanyagolhatóan kis
magasságban lebegve a fedôlap fölött) egy újabb négyzetlap
foglal helyet, amit ""kockás" festékkel festünk be, hogy
hasonlítson egy valódi sakktáblára.
A különbözô textúrákat (a testek felületmintáit) könnyen
meg lehet érteni a forráslistából, tehát rájuk nem térünk
ki részletesebben. Illetve egy dolgot mégis megemlítünk,
ugyanis elkövettünk egy turpisságot. A valódi márvány
fekete-zöld-fehér színét jobban megközelítendô,
beállítottunk egy zöld színû lámpát, ami a ""márványunkból"
egyes helyeken zöldes árnyalatokat csal ki, míg a többi
testnél a fehér fény visszaverôdése lesz a meghatározó.
Erre azért volt szükség, hogy ne kelljen egy többszörösen
egymásba ágyazódó felületstruktúrát létrehozni.
Ha az eddigi eredmény nagyjából jó, akkor egy nagyobb
felbontásban végezzük el a finombeállításokat (1. kép) --
ezúttal például azt, hogy a tábla erezete megfelel-e. Ezek
után néhány fontosabb tárgyat helyezzünk el, és nézzük meg
az eredményt kis felbontásban. Következô lépésként
helyezzük el a bábukat, most még csak egy-egy hengerrel
érdemes helyettesíteni ôket (hiszen egyelôre csak arra
vagyunk kíváncsiak, hogy mi hol lesz a késôbbiekben).
Miután a bábuk elfoglalták a helyüket, egyenként helyezzük
ki ôket egy külön file-ba. Ezt minden összetettebb testnél
érdemes elvégezni, hiszen így csak a tárgyat számoltatjuk
ki a géppel (a környezetét meg nem), amikor módosítunk
rajta. Ha a tárgyak már az elképzeléseinknek megfelelôen
néznek ki, akkor helyezzük ôket vissza (2. kép).
Fokozatosan bôvítgessünk különbözô tárgyakkal, hogy a kép
""hitelesebb" legyen. Rakjunk fel például egy sakkórát (3.
kép). Majd rakjunk fel néhány leütött bábut is, a tábla
mellé (4. kép). Ezek után különbözô apró részletekkel lehet
gazdagítani a képet, például filctalpakat helyezni a
sakkbábuk aljára, ellenôrizni az óra mutatójának árnyékát
-- ha ezeket eddig még nem tettük volna meg.
Vigyázzunk arra, hogy ne bonyolítsuk túl a képet, mert
elveszti a hatását, az ""igazi" képeket úgysem fogjuk soha
utolérni. Ezért nincs fent példánkon sem mind a harminckét
bábu. S ugyanezért ne törekedjünk túlzottan a realitásra,
inkább a látványosság legyen a fontos. Persze a realitás
elhanyagolásával is csínján kell bánni. Nem szabad
elôfordulnia, hogy egy képen ég egy lámpa, és az izzón
megcsillan a fény, az alja pedig szürke árnyékos. Csalni
leginkább a színekkel és az arányokkal lehet. Mint fentebb
a márványnál, vagy ha egy test egyik oldala nem elég
árnyékos, nem homogén színûre, hanem oldalanként sötétebbre
állítjuk be, vagy ha egy tárgy perspektívája rossz, de a
teljes képé jó, akkor a tárgy távolabbi méreteit egy picit
változtassuk meg.
És végezetül egy jótanács: ha a Vivid fordító ""MATH error"
felkiáltással áll le, akkor: 1. Nézzük meg az ""at" egyik
értékét a @Kstudio@N résznél, növeljük meg például a
@KZ@N-t egy elhanyagolhatóan kicsi számmal (valamiért a
program vektorkezelése nem tökéletes). 2. Nézzük meg,
nincs-e olyan testünk, amelynek gyakorlatilag csak két
oldala van, tehát például egy olyan négyzet, amelynek
két-két koordinátapárja megegyezik.
Sajnos a számolások még az igazán gyors PC-ken is lassúak.
Egyrészt rengeteget kell számolni -- koprocesszor nélkül ne
is indítsuk el --, másrészt a ray-tracing programok
általában Amigáról lettek átírva. Ebbôl következôen nem
használják ki teljesen a gép lehetôségeit (nem mindegyik,
például a QRT és a Vivid már PC-n íródott). Nagyot
gyorsíthatna a programok futásán az is, ha a programozók
nem a könnyû javíthatóságot és áttekinthetôséget tartanák
szem elôtt (ami általában nagyon helyes), hanem a
sebességet, tehát például a viszonylag lassú lebegôpontos
mûveleteket trükkösen átírnák egész számokkal végzett
mûveletekre. A munka sebességének érzékeltetésére
közzétesszük a mi idôméréseink eredményeit. Az egyik
oszlop egy 50 MHz-es Netrend 486DX-n, a másik egy 66 MHZ-es
Makro 486DX2-n készült (e gépek teljesítményérôl szintén
ebben a számban olvashatnak). A táblázat adataiból könnyen
levonható a következtetés, hogy a mérettel közel egyenesen
arányos a számolás idôigénye. Egy nagy képet még ezek a
gépek is több napig számolnak. A nyitóképet például --
amely 4096x2732 pont felbontású -- több mint négy nap
alatt számolta ki az egyik gép.
A Vivid kettes verzióját csak lapzártakor kaptuk kézhez,
így a cikken már jelentôsen nem tudtunk változtatni,
fentiekben az 1.0 verziót mutattuk be. Az új verzióban sok
apró hibát kijavítottak, s kiküszöbölték a két legégetôbb
problémát: az objektumkiemelést és a memóriakezelést.
Most már bármennyi objektumot tudunk kezelni, ha van elég
memóriánk, a régi verzióban a határ úgy 2000 darab körül
volt. Növelték a felhasználható fényforrások számát, azok
számára, akik türelmesen ki tudják várni az alkalmazásuk
által megnövekedett számolási idôt.
Ugyancsak hasznos újítás, hogy több gépen is
számoltathatjuk ugyanazt a képet, megadva a kezdôsort és a
végsort, majd a kész képcsíkokat összemásolhatjuk egy
képpé. Helyet kapott egy vázlatfunkció is, ami
meggyorsítja a ""fejlesztést", hiszen így már nincs szükség
az egyes elemek külön file-okba való kipakolgatására. Az
új verzió támogatja az alapvetô matematikai mûveleteket --
például összeadás, szorzás, szögfüggvények -- számokra,
vektorokra és színekre nézve. Támogatja a különbözô
globális transzformációkat és a bonyolultabb alakzatok
létrehozását a különbözô metszési lehetôségekkel.
Ezek persze csak a legfontosabb és elsôre is szembetûnô
újítások, amelyeket a dokumentáció elolvasása után tudtunk
meg. Külön kiemeljük, hogy a szerzô a dokumentációt
jelentôsen bôvítette és javította, a tôle megszokott
humoros hangnem továbbra sem maradt el. Akinek van egy kis
ideje, annak már csak ezért is érdemes végigböngésznie a
leírást. Sok olyan apró dolog van, amit most nem tudtunk
megemlíteni. Reméljük, hogy ezek bemutatására is sort
tudunk keríteni, s ezért sem vállalkoztunk a termék
elkapkodott leírására. Elöljáróban csak annyit: a leírás
húsz bekezdése taglalja az újításokat. Ezeket mind meg
kellene vizsgálni a gyakorlatban is, de ez sok idôbe kerül
(egy ray-tracernél különösen).
Jó hír azok számára, akik szeretnék felvenni a kapcsolatot
a program szerzôjével, Stephen B. Coy-jal, hogy
folyamatosan megszerezhessék a legújabb kiegészítôket: a
dokumentációban megtalálhatók azon BBS-ek címei, ahol a
szerzô legtöbbször fordul meg. Természetesen él régi
e-mail címe is, és ""emailetileg" ez a leggyorsabb útja a
kapcsolatfelvételnek, de sajnos ez Magyarországon még nem
egy kiforrott dolog.
Sajnos a PC-s ray-tracing áttörése ""ma" még nem várható,
csak ha már mindenkinek egy 486-os agyú ""vadállat" lapul
az asztalán, esetleg egy Pentium alapú gép. Addig mit sem
ér a Vivid szerzôjének jóindulata, aki sörware-nek
nyilvánította a programját (azaz, ha tetszik, igyál egy
sört az egészségére, ha pénzt nem küldesz). Ajánlott
regisztrációs díjnak 30 dollárt ír, a 386-osokra fordított
változatért 50 dollárt kér. Ezért a Zortech és az Intel
DOS-extenderével lefordított programot (mind a kettôt, és
ízlés szerint választhatunk) kapjuk.
@KLencsés Gábor@N
<1 - box> @VA Vivid leírónyelve@N
@KMegjegyzés:@N
// Egy soros megjegyés
/* Megjegyzés */
@KParaméterezés:@N
A paramétereket több módon is megadhatjuk (például 0.5, .5
stb.) Az @Kx@N paraméter a szélesség, az @Ky@N a mélység, a
@Kz@N a magasság értékét adja meg.
@KUtasítások:@N
studio = [Alapbeállítások
from = x y z; Honnan nézzük a teret
at = x y z; Hova nézünk
up = x y z; A vízszintes sík normálvektora
(""felfelé" mutató vektor)
angle = ang; Látószög
resolution = i j; Felbontás
aspect = asp; A torzítás mértéke (x/y)
ambient = acolor; Az árnyék színe
background = bcolor; A háttér színe
haze = density; Köd sûrûsége
antialias = mode; Az antialiasing módja
threshold = dist; Az antialiasing finomsága (ha van)
jitter; Véletlen fénytörések bekapcsolása
aperture = size; Lencseméret
focal_length = dist; Fókusztávolság
no_shadows; Årnyékok kikapcsolása
depth = max_depth; A fénytörések mélysége
sphere = [Gömb
center = x y z; Középpont
radius = r; Åtmérô
(radius2 = r2; Második átmérô (véletlenül választ
a két átmérô között))
@N
ring = [Korong
center = x y z; Középpont
radius = r; Åtmérô
(normal = xn yn zn; Normálvektor)
(radius2 = 2; Belsô átmérô)
polygon = [Sokszög
points = n; Pontjai
vertex = x y z; A pontok koordinátái
(. További pontok)
@N
patch = [Háromszög
vertex = x1 y1 z1; Pont1
normal1 = xn1 yn1 zn1; Normálvektor1
vertex = x2 y2 z2; Pont2
normal2 = xn2 yn2 zn2; Normálvektor2
vertex = x3 y3 z3; Pont3
normal3 = xn3 yn3 zn3; Normálvektor3
<2 - táblázat> @VIdômérések@N
486DX/50 486DX2/66
kép méret perc:mp perc:mp
BALL 1024x 768 99:34 --
PBCHESS 40x 40 0:25 0:19
PBCHESS 100x 100 2:00 1:33
PBCHESS 400x 400 21:21 16:28
PBCHESS 1024x 768 92:34 71:25
PBCHESS 2048x2048 246:00 --
VIVID3 1024x 768 565:49 --
A BALL és a VIVID3 a Vividhez adott demófile-ok, a PBCHESS
a cikkben szereplô sakktábla egy korai állapota. A
PBCHESS-t -- 40x40-es felbontást kérve -- lefuttattuk egy
33 MHz-es, koprocesszor nélküli 386-os gépen, mintegy
háromnegyed óra alatt készült el.
@V15 - lista@N
// sakktábla
studio =
[from = 20 20 15;
at = 0 0 0.1;
up = 0 0 1;
angle = 30;
res = 2048 1366;
antialias = adaptive;
threshold = 8;
aspect = 1.488;
background = black;
ambient = gray;
@N
// fények
light =
[center = 10 10 10;
falloff = 0;
color = white;
type = point;
light =
[center = 12 12 12;
falloff = 0;
color = green;
type = point;
@N
// Asztallap
// faminta
surface =
[texture =
[noise =
[scale = 1.1 .9 1;
amp = .2;
terms = 3;
pattern = spherical;
scale = 0 1 1;
offset = 0 0 1;
blend = .4;
radius = .15;
radius = .05;
surf = [diff = .45 .25 .20; @N // light rings
surf = [diff = .20 .05 .03; // dark rings
@N
ring =
[center = 0 0 -.5;
normal = 0 0 1;
radius = 20;
@N
// sakk-kockák
surface =
[texture =
[pattern = checker;
scale = 1 1 0;
surface = [diff = white;
surface =
[diff = black;
spec = 0.7 0.7 0.7;
shine = 100;
@N
@N
polygon = [points = 4;
vertex = 4 4 0.3;
vertex = 4 -4 0.3;
vertex = -4 -4 0.3;
vertex = -4 4 0.3;
// táblaanyag
surface =
[texture =
[blend = 0.5;
pattern = checker;
noise =
[amp = 3;
terms = 2;
@N
scale = 1 1 1;
surface = [diff = gray;
surface =
[diff = black;
shine = 20;
@N
@N
// surface = [diff = black; spec = 0.5 0.5 0.5;
polygon = [points = 4;
vertex = -5 -5 0;
vertex = -5 5 0;
vertex = -5 5 0.2999;
vertex = -5 -5 0.2999;
@N
polygon = [points = 4;
vertex = 5 -5 0;
vertex = 5 5 0;
vertex = 5 5 0.2999;
vertex = 5 -5 0.2999;
polygon = [points = 4;
vertex = -5 -5 0;
vertex = -5 -5 0.2999;
vertex = 5 -5 0.2999;
vertex = 5 -5 0;
@N
polygon = [points = 4;
vertex = -5 5 0;
vertex = -5 5 0.2999;
vertex = 5 5 0.2999;
vertex = 5 5 0;
polygon = [points = 4;
vertex = -5 -5 0;
vertex = -5 5 0;
vertex = 5 5 0;
vertex = 5 -5 0;
@N
polygon = [points = 4;
vertex = -5 -5 0.2999;
vertex = -5 5 0.2999;
vertex = 5 5 0.2999;
vertex = 5 -5 0.2999;
// bábuk
surface = [diff = blue; shine = 1000; @N
// gyalogok
cone = [apex_radius = 0.15; apex = 1.5 -1.5 1.31;
base_radius = 0.3; base = 1.5 -1.5 0.31;
sphere = [radius = 0.3; center = 1.5 -1.5 1.59; @N
cone = [apex_radius = 0.15; apex = 6 -2 1.01;
base_radius = 0.3; base = 6 -2 0.01;
sphere = [radius = 0.3; center = 6 -2 1.29; @N
cone = [apex_radius = 0.15; apex = 6 -3 1.01;
base_radius = 0.3; base = 6 -3 0.01;
sphere = [radius = 0.3; center = 6 -3 1.29; @N
cone = [apex_radius = 0.15; apex = 6.5 -1 0.15;
base_radius = 0.3; base = 5.5 -1 0.15;
sphere = [radius = 0.3; center = 6.3 -1 0.15; @N
// bástya
cone = [apex_radius = 0.18; apex = -3.5 -2.5 1.31;
base_radius = 0.3; base = -3.5 -2.5 0.41;
cone = [apex_radius = 0.28; apex = -3.5 -2.5 1.31;
base_radius = 0.28; base = -3.5 -2.5 1.71; @N
cone = [apex_radius = 0.3; apex = -3.5 -2.5 0.31;
base_radius = 0.3; base = -3.5 -2.5 0.41;
// király
cone = [apex_radius = 0.18; apex = -1.5 -2.5 1.61;
base_radius = 0.3; base = -1.5 -2.5 0.31; @N
ring = [center = -1.5 -2.5 1.52;
radius = 0.3;
normal = 0 0 1;
sphere = [radius = 0.29; center = -1.5 -2.5 1.81; @N
sphere = [radius = 0.15; center = -1.5 -2.5 2.1;
cone = [apex_radius = 0.3; apex = -1.5 -2.5 0.31;
base_radius = 0.3; base = -1.5 -2.5 0.41; @N
// huszár
cone = [apex_radius = 0.16; apex = 6 -4 1.01;
base_radius = 0.3; base = 6 -4 0.01;
polygon = [points = 4;
vertex = 6.3 -4.15 1.31;
vertex = 6.3 -3.85 1.31;
vertex = 6.3 -3.85 0.91;
vertex = 6.3 -4.15 0.91;
@N
polygon = [points = 4;
vertex = 5.7 -4.2 1.51;
vertex = 5.7 -3.8 1.51;
vertex = 5.7 -3.8 1.01;
vertex = 5.7 -4.2 1.01;
polygon = [points = 4;
vertex = 6.3 -4.15 1.21;
vertex = 6.3 -4.15 0.91;
vertex = 5.7 -4.2 1.01;
vertex = 5.7 -4.2 1.51;
@N
polygon = [points = 4;
vertex = 6.3 -3.85 1.21;
vertex = 6.3 -3.85 0.91;
vertex = 5.7 -3.8 1.01;
vertex = 5.7 -3.8 1.51;
polygon = [points = 4;
vertex = 6.3 -4.15 1.21;
vertex = 6.3 -3.85 1.21;
vertex = 5.7 -3.8 1.51;
vertex = 5.7 -4.2 1.51;
@N
polygon = [points = 4;
vertex = 6.3 -4.15 0.91;
vertex = 6.3 -3.85 0.91;
vertex = 5.7 -3.8 1.01;
vertex = 5.7 -4.2 1.01;
surface = [diff = red; shine = 1000; @N
// gyalog
cone = [apex_radius = 0.15; apex = -2.5 1.5 1.31;
base_radius = 0.3; base = -2.5 1.5 0.31;
sphere = [radius = 0.3; center = -2.5 1.5 1.59; @N
cone = [apex_radius = 0.15; apex = -6 3 1.01;
base_radius = 0.3; base = -6 3 0.01;
sphere = [radius = 0.3; center = -6 3 1.29; @N
// bástya
cone = [apex_radius = 0.18; apex = -6 2 1.01;
base_radius = 0.3; base = -6 2 0.01;
cone = [apex_radius = 0.28; apex = -6 2 1.01;
base_radius = 0.28; base = -6 2 1.41; @N
cone = [apex_radius = 0.3; apex = -6 2 0.01;
base_radius = 0.3; base = -6 2 0.11;
// huszár
cone = [apex_radius = 0.16; apex = 1.5 1.5 1.31;
base_radius = 0.3; base = 1.5 1.5 0.31; @N
polygon = [points = 4;
vertex = 1.8 1.35 1.61;
vertex = 1.8 1.65 1.61;
vertex = 1.8 1.65 1.21;
vertex = 1.8 1.35 1.21;
polygon = [points = 4;
vertex = 1.2 1.3 1.81;
vertex = 1.2 1.7 1.81;
vertex = 1.2 1.7 1.31;
vertex = 1.2 1.3 1.31;
@N
polygon = [points = 4;
vertex = 1.8 1.35 1.51;
vertex = 1.8 1.35 1.21;
vertex = 1.2 1.3 1.31;
vertex = 1.2 1.3 1.81;
polygon = [points = 4;
vertex = 1.8 1.65 1.51;
vertex = 1.8 1.65 1.21;
vertex = 1.2 1.7 1.31;
vertex = 1.2 1.7 1.81;
@N
polygon = [points = 4;
vertex = 1.8 1.35 1.51;
vertex = 1.8 1.65 1.51;
vertex = 1.2 1.7 1.81;
vertex = 1.2 1.3 1.81;
polygon = [points = 4;
vertex = 1.8 1.35 1.21;
vertex = 1.8 1.65 1.21;
vertex = 1.2 1.7 1.31;
vertex = 1.2 1.3 1.31;
@N
cone = [apex_radius = 0.16; apex = -6 4 1.01;
base_radius = 0.3; base = -6 4 0.01;
polygon = [points = 4;
vertex = -5.7 3.85 1.31;
vertex = -5.7 4.15 1.31;
vertex = -5.7 4.15 0.91;
vertex = -5.7 3.85 0.91;
@N
polygon = [points = 4;
vertex = -6.3 3.8 1.51;
vertex = -6.3 4.2 1.51;
vertex = -6.3 4.2 1.01;
vertex = -6.3 3.8 1.01;
polygon = [points = 4;
vertex = -5.7 3.85 1.21;
vertex = -5.7 3.85 0.91;
vertex = -6.3 3.8 1.01;
vertex = -6.3 3.8 1.51;
@N
polygon = [points = 4;
vertex = -5.7 4.15 1.21;
vertex = -5.7 4.15 0.91;
vertex = -6.3 4.2 1.01;
vertex = -6.3 4.2 1.51;
polygon = [points = 4;
vertex = -5.7 3.85 1.21;
vertex = -5.7 4.15 1.21;
vertex = -6.3 4.2 1.51;
vertex = -6.3 3.8 1.51;
@N
polygon = [points = 4;
vertex = -5.7 3.85 0.91;
vertex = -5.7 4.15 0.91;
vertex = -6.3 4.2 1.01;
vertex = -6.3 3.8 1.01;
// király
cone = [apex_radius = 0.18; apex = 3.5 -1.5 1.61;
base_radius = 0.3; base = 3.5 -1.5 0.31; @N
ring = [center = 3.5 -1.5 1.52;
radius = 0.3;
normal = 0 0 1;
sphere = [radius = 0.29; center = 3.5 -1.5 1.81; @N
sphere = [radius = 0.15; center = 3.5 -1.5 2.1;
cone = [apex_radius = 0.3; apex = 3.5 -1.5 0.31;
base_radius = 0.3; base = 3.5 -1.5 0.41; @N
// talpak
surface = [diff = green;
cone = [apex_radius = 0.3; apex = 1.5 -1.5 0.3;
base_radius = 0.3; base = 1.5 -1.5 0.31; @N
cone = [apex_radius = 0.3; apex = -3.5 -2.5 0.3;
base_radius = 0.3; base = -3.5 -2.5 0.31;
cone = [apex_radius = 0.3; apex = -1.5 -2.5 0.3;
base_radius = 0.3; base = -1.5 -2.5 0.31; @N
cone = [apex_radius = 0.3; apex = -2.5 1.5 0.3;
base_radius = 0.3; base = -2.5 1.5 0.31;
cone = [apex_radius = 0.3; apex = 1.5 1.5 0.3;
base_radius = 0.3; base = 1.5 1.5 0.31; @N
cone = [apex_radius = 0.3; apex = 3.5 -1.5 0.3;
base_radius = 0.3; base = 3.5 -1.5 0.31;
cone = [apex_radius = 0.3; apex = 6 -2 0.3;
base_radius = 0.3; base = 6 -2 0.31; @N
cone = [apex_radius = 0.3; apex = 6 -3 0.3;
base_radius = 0.3; base = 6 -3 0.31;
cone = [apex_radius = 0.3; apex = 6 -4 0.3;
base_radius = 0.3; base = 6 -4 0.31; @N
cone = [apex_radius = 0.3; apex = -6 2 0.3;
base_radius = 0.3; base = -6 2 0.31;
cone = [apex_radius = 0.3; apex = -6 3 0.3;
base_radius = 0.3; base = -6 3 0.31; @N
cone = [apex_radius = 0.3; apex = -6 4 0.3;
base_radius = 0.3; base = -6 4 0.31;
cone = [apex_radius = 0.3; apex = 5.5 -1 0.15;
base_radius = 0.3; base = 5.49 -1 0.15; @N
// óra
surface = [diff = white;
polygon = [points = 4;
vertex = -3 -6 0;
vertex = -3 -8 0;
vertex = -3 -8 3;
vertex = -3 -6 3;
@N
polygon = [points = 4;
vertex = 3 -6 0;
vertex = 3 -8 0;
vertex = 3 -8 3;
vertex = 3 -6 3;
polygon = [points = 4;
vertex = -3 -6 0;
vertex = -3 -6 3;
vertex = 3 -6 3;
vertex = 3 -6 0;
@N
polygon = [points = 4;
vertex = -3 -8 0;
vertex = -3 -8 3;
vertex = 3 -8 3;
vertex = 3 -8 0;
polygon = [points = 4;
vertex = -3 -6 0;
vertex = -3 -8 0;
vertex = 3 -8 0;
vertex = 3 -6 0;
@N
surface = [diff = 0.95 0.95 0.95;
polygon = [points = 4;
vertex = -3 -6 3;
vertex = -3 -8 3;
vertex = 3 -8 3;
vertex = 3 -6 3;
@N
surface = [diff = gray;
ring = [center = -1.5 -5.99 1.5;
radius = 1.3;
normal = 0 1 0; @N
ring = [center = 1.5 -5.99 1.5;
radius = 1.3;
normal = 0 1 0;
surface = [diff = blue; @N
cone = [apex_radius = 0.04; apex = -1.5 -5.83 1.5;
base_radius = 0.04; base = -1.5 -5.83 2.78;
cone = [apex_radius = 0.9; apex = -1.5 -7 3.3;
base_radius = 0.9; base = -1.5 -7 3; @N
ring = [center = -1.5 -7 3.3;
radius = 0.9;
normal = 0 0 1;
surface = [diff = red; @N
cone = [apex_radius = 0.04; apex = 1.5 -5.83 1.5;
base_radius = 0.04; base = 1.5 -5.83 2.78;
cone = [apex_radius = 0.9; apex = 1.5 -7 3;
base_radius = 0.9; base = 1.5 -7 3.3; @N
ring = [center = 1.5 -7 3.3;
radius = 0.9;
normal = 0 0 1;